package com.xxl.job.core.handler.impl;

import com.xxl.job.core.context.XxlJobContext;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.glue.GlueTypeEnum;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.log.XxlJobFileAppender;
import com.xxl.job.core.util.ScriptUtil;

import java.io.File;

/**
 * Created by xuxueli on 17/4/27.
 */
public class ScriptJobHandler extends IJobHandler {

  private int jobId;
  private long glueUpdatetime;
  private String gluesource;
  private GlueTypeEnum glueType;

  public ScriptJobHandler(int jobId, long glueUpdatetime, String gluesource,
      GlueTypeEnum glueType) {
    this.jobId = jobId;
    this.glueUpdatetime = glueUpdatetime;
    this.gluesource = gluesource;
    this.glueType = glueType;

    // clean old script file
    File glueSrcPath = new File(XxlJobFileAppender.getGlueSrcPath());
    if (glueSrcPath.exists()) {
      File[] glueSrcFileList = glueSrcPath.listFiles();
      if (glueSrcFileList != null && glueSrcFileList.length > 0) {
        for (File glueSrcFileItem : glueSrcFileList) {
          if (glueSrcFileItem.getName().startsWith(String.valueOf(jobId) + "_")) {
            glueSrcFileItem.delete();
          }
        }
      }
    }

  }

  public long getGlueUpdatetime() {
    return glueUpdatetime;
  }

  @Override
  public void execute() throws Exception {

    if (!glueType.isScript()) {
      XxlJobHelper.handleFail("glueType[" + glueType + "] invalid.");
      return;
    }

    // cmd
    String cmd = glueType.getCmd();

    // make script file
    String scriptFileName = XxlJobFileAppender.getGlueSrcPath()
        .concat(File.separator)
        .concat(String.valueOf(jobId))
        .concat("_")
        .concat(String.valueOf(glueUpdatetime))
        .concat(glueType.getSuffix());
    File scriptFile = new File(scriptFileName);
    if (!scriptFile.exists()) {
      ScriptUtil.markScriptFile(scriptFileName, gluesource);
    }

    // log file
    String logFileName = XxlJobContext.getXxlJobContext().getJobLogFileName();

    // script params：0=param、1=分片序号、2=分片总数
    String[] scriptParams = new String[3];
    scriptParams[0] = XxlJobHelper.getJobParam();
    scriptParams[1] = String.valueOf(XxlJobContext.getXxlJobContext().getShardIndex());
    scriptParams[2] = String.valueOf(XxlJobContext.getXxlJobContext().getShardTotal());

    // invoke
    XxlJobHelper.log("----------- script file:" + scriptFileName + " -----------");
    int exitValue = ScriptUtil.execToFile(cmd, scriptFileName, logFileName, scriptParams);

    if (exitValue == 0) {
      XxlJobHelper.handleSuccess();
      return;
    } else {
      XxlJobHelper.handleFail("script exit value(" + exitValue + ") is failed");
      return;
    }

  }

}
